﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Observer
{
    /*
        情景模式： 日志管理是对象管理所以的日志者，
    但是日志要可能要以不同的方式记录到数据库或者文件中
        其中的时间也可以用 委托方法来实现（应为事件本身就是一种叫安全的委托）
     */
    public class LogInfo
    {
        public Guid Gid { get; set; }
        public string MainMessage { get; set; }
        public string DetailInfo { get; set; }
        public DateTime Time { get; set; }

    }

    public class IncrementEventArges : EventArgs
    {
        public LogInfo Datainfo { get; set; }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("主要错误内容：{0}", Datainfo.MainMessage);
            sb.AppendFormat("错误时间：{0}", Datainfo.Time);
            sb.AppendFormat("详细错误内容：{0}", Datainfo.MainMessage);
            sb.Append("巴拉巴拉巴拉，省略一万字。。。。。");
            return sb.ToString();
        }
    }

    public class LogManager
    {
        Mutex mutex = new Mutex();
        List<LogInfo> LogList = new List<LogInfo>();

        public EventHandler writeHandler; //可以跟泛型限制 EventArgs 的类型例如： <IncrementEventArges>

        public void AddLog(LogInfo log)
        {
            mutex.WaitOne();
            this.LogList.Add(log);
            mutex.ReleaseMutex();
        }

        public void WriteLog()
        {
            mutex.WaitOne();
            if (writeHandler != null)
            {
                LogList.ForEach(ret =>
                {
                    writeHandler(this, new IncrementEventArges() { Datainfo = ret });
                });
            }

            LogList.Clear();
            mutex.ReleaseMutex();
        }
    }


    //写日志的方法
    public class WriteLogClass
    {
        public void WriteLogToFile(object obj, EventArgs args)
        {
            if (args is IncrementEventArges)
            {
                Console.WriteLine("伪代码： 记录日志到文本中:{0}", ((IncrementEventArges)args).ToString());
            }
            else
            {
                Console.WriteLine("伪代码： 记录日志到文本中 args 参数类型不对 ");
            }

        }

        public void WriteLogToSqlite(object obj, EventArgs args)
        {
            if (args is IncrementEventArges)
            {
                Console.WriteLine("伪代码： 记录sqlite数据里:{0}", ((IncrementEventArges)args).ToString());
            }
            else
            {
                Console.WriteLine("伪代码： 记录sqlite数据里args 参数类型不对 ");
            }
        }
    }
}
